///////////////// comment ////////////////

#ifndef __H_COMMANDS
#define __H_COMMANDS

#include "combined.h"
#include "definitions.h"
#include "stringutil.h"

// Command::_flags definitions...
#define COMMAND_ENABLED	A
#define COMMAND_OMNISET	B

// The base command class
class Command {
	protected:
		// Data...
		std::string _name;
		unsigned	_level;
		unsigned	_flags;
		std::string _tags;
		std::string _syntax;
		std::string _help;

	public:
		// Constructors...
		Command( void );
		virtual ~Command( void );

		// Public accessor methods...
		void		setName( const std::string& name );
		std::string	getName( void ) const;
		void		setLevel( const unsigned& level );
		unsigned	getLevel( void ) const;
		void		setEnabled( const bool& enabled );
		bool		getEnabled( void ) const;
		void		setOmniset( const bool& omniset );
		bool		getOmniset( void ) const;
		void		setTags( const std::string& tags );
		std::string	getTags( void ) const;
		void		setSyntax( const std::string& syntax );
		std::string	getSyntax( void ) const;
		void		setHelp( const std::string& help );
		std::string	getHelp( void ) const;

		// General methods...
		void			addSyntax( const std::string& line );
		void			addHelp( const std::string& line );
		virtual bool	execute( Character* character, const std::string& args ) = 0;
};

// Our command class macro... makes less work for defining each command
#define DEF_COMMAND( CommandName )													\
class CommandName: public Command {													\
    public:																			\
		CommandName( void );														\
		virtual ~CommandName( void ) { };											\
		virtual bool execute( Character* character, const std::string& args );		\
};

/////////////////////////////////// commands /////////////////////////////////////////
DEF_COMMAND(CmdAedit)
DEF_COMMAND(CmdAlist)
DEF_COMMAND(CmdAsave)
DEF_COMMAND(CmdAt)
DEF_COMMAND(CmdBoards)
DEF_COMMAND(CmdBuzz)
DEF_COMMAND(CmdClear)
DEF_COMMAND(CmdClose)
DEF_COMMAND(CmdColors)
DEF_COMMAND(CmdCommands)
DEF_COMMAND(CmdDemote)
DEF_COMMAND(CmdDescription)
DEF_COMMAND(CmdDisable)
DEF_COMMAND(CmdDisconnect)
DEF_COMMAND(CmdDown)
DEF_COMMAND(CmdDrop)
DEF_COMMAND(CmdEast)
DEF_COMMAND(CmdEat)
DEF_COMMAND(CmdEmote)
DEF_COMMAND(CmdEnable)
DEF_COMMAND(CmdForce)
DEF_COMMAND(CmdGecho)
DEF_COMMAND(CmdGet)
DEF_COMMAND(CmdGive)
DEF_COMMAND(CmdGoto)
DEF_COMMAND(CmdHelp)
DEF_COMMAND(CmdInformation)
DEF_COMMAND(CmdInventory)
DEF_COMMAND(CmdLook)
DEF_COMMAND(CmdMedit)
DEF_COMMAND(CmdMlist)
//DEF_COMMAND(CmdMload)
DEF_COMMAND(CmdNorth)
//DEF_COMMAND(CmdNotes)
//DEF_COMMAND(CmdOedit)
//DEF_COMMAND(CmdOlist)
//DEF_COMMAND(CmdOload)
DEF_COMMAND(CmdOmninet)
DEF_COMMAND(CmdOmniset)
DEF_COMMAND(CmdOpen)
DEF_COMMAND(CmdPassword)
DEF_COMMAND(CmdPedit)
DEF_COMMAND(CmdPoofin)
DEF_COMMAND(CmdPoofout)
DEF_COMMAND(CmdPoofs)
DEF_COMMAND(CmdPromote)
DEF_COMMAND(CmdPrompt)
DEF_COMMAND(CmdQuit)
DEF_COMMAND(CmdReboot)
DEF_COMMAND(CmdRedit)
DEF_COMMAND(CmdReply)
DEF_COMMAND(CmdSave)
DEF_COMMAND(CmdSay)
DEF_COMMAND(CmdScore)
DEF_COMMAND(CmdShutdown)
//DEF_COMMAND(CmdSiteban)
DEF_COMMAND(CmdSockets)
DEF_COMMAND(CmdSouth)
DEF_COMMAND(CmdSummon)
DEF_COMMAND(CmdTake)
DEF_COMMAND(CmdTell)
DEF_COMMAND(CmdTimers)
DEF_COMMAND(CmdTitle)
DEF_COMMAND(CmdTransport)
DEF_COMMAND(CmdUp)
DEF_COMMAND(CmdWest)
DEF_COMMAND(CmdWho)
DEF_COMMAND(CmdWhos)
/////////////////////////////////// area edit commands /////////////////////////////////////////
DEF_COMMAND(aCmdCommands)
DEF_COMMAND(aCmdExit)
DEF_COMMAND(aCmdKeyword)
DEF_COMMAND(aCmdList)
DEF_COMMAND(aCmdMake)
DEF_COMMAND(aCmdName)
DEF_COMMAND(aCmdPermissions)
DEF_COMMAND(aCmdRemove)
DEF_COMMAND(aCmdSelect)
DEF_COMMAND(aCmdView)
/////////////////////////////////// mob edit commands /////////////////////////////////////////
DEF_COMMAND(mCmdAc)
DEF_COMMAND(mCmdAcBash)
DEF_COMMAND(mCmdAcSlash)
DEF_COMMAND(mCmdAcPierce)
DEF_COMMAND(mCmdAcExotic)
DEF_COMMAND(mCmdCharisma)
DEF_COMMAND(mCmdClass)
DEF_COMMAND(mCmdCommands)
DEF_COMMAND(mCmdConstitution)
DEF_COMMAND(mCmdDamroll)
DEF_COMMAND(mCmdDescription)
DEF_COMMAND(mCmdDexterity)
DEF_COMMAND(mCmdExit)
DEF_COMMAND(mCmdGender)
DEF_COMMAND(mCmdHp)
DEF_COMMAND(mCmdHitroll)
DEF_COMMAND(mCmdIntelligence)
DEF_COMMAND(mCmdLevel)
DEF_COMMAND(mCmdLong)
DEF_COMMAND(mCmdMana)
DEF_COMMAND(mCmdMove)
DEF_COMMAND(mCmdName)
DEF_COMMAND(mCmdRace)
DEF_COMMAND(mCmdSaves)
DEF_COMMAND(mCmdShort)
DEF_COMMAND(mCmdStrength)
DEF_COMMAND(mCmdView)
DEF_COMMAND(mCmdWimpy)
DEF_COMMAND(mCmdWisdom)/*
/////////////////////////////////// note edit commands /////////////////////////////////////////
DEF_COMMAND(nCmdBody)
DEF_COMMAND(nCmdCommands)
DEF_COMMAND(nCmdDelete)
DEF_COMMAND(nCmdExit)
DEF_COMMAND(nCmdList)
DEF_COMMAND(nCmdNew)
DEF_COMMAND(nCmdRecipient)
DEF_COMMAND(nCmdSelect)
DEF_COMMAND(nCmdSend)
DEF_COMMAND(nCmdSubject)
DEF_COMMAND(nCmdView)
/////////////////////////////////// object edit commands /////////////////////////////////////////
DEF_COMMAND(oCmdCommands)
DEF_COMMAND(oCmdDescription)
DEF_COMMAND(oCmdExit)
DEF_COMMAND(oCmdLong)
DEF_COMMAND(oCmdTags)
DEF_COMMAND(oCmdShort)
DEF_COMMAND(oCmdView)*/
/////////////////////////////////// player edit commands /////////////////////////////////////////
DEF_COMMAND(pCmdAge)
DEF_COMMAND(pCmdCommands)
DEF_COMMAND(pCmdExit)
DEF_COMMAND(pCmdEcho)
DEF_COMMAND(pCmdGender)
DEF_COMMAND(pCmdLname)
DEF_COMMAND(pCmdName)
/////////////////////////////////// room edit commands /////////////////////////////////////////
DEF_COMMAND(rCmdCommands)
DEF_COMMAND(rCmdDescription)
DEF_COMMAND(rCmdDig)
DEF_COMMAND(rCmdExit)
DEF_COMMAND(rCmdInfo)
DEF_COMMAND(rCmdLink)
DEF_COMMAND(rCmdMake)
DEF_COMMAND(rCmdName)
DEF_COMMAND(rCmdRemove)
DEF_COMMAND(rCmdReset)
DEF_COMMAND(rCmdRlist)
DEF_COMMAND(rCmdSector)
DEF_COMMAND(rCmdUnlink)
/////////////////////////////////// text editor commands /////////////////////////////////////////
DEF_COMMAND(tCmdAdd)
DEF_COMMAND(tCmdExit)
DEF_COMMAND(tCmdHelp)
DEF_COMMAND(tCmdInsert)
DEF_COMMAND(tCmdRemove)
DEF_COMMAND(tCmdReplace)



#endif // #ifndef __H_COMMANDS
